# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import render

# Create your views here.


'''
需求: 获取一个图片验证码
前端: 当用户第一次访问页面或者点击注册验证码的时候,会发送一个请求, 这个请求要携带 用户的唯一id [UUID]
        这个UUID是前端生成传递, 会随着请求传递给后端服务器
后端: 请求
        GET   http://ip:port/image_codes/uuid/
     逻辑
        1. 接受请求参数
        2. 验证请求参数
        3. 生成图片验证码, 获取图片验证码的内容[4个字符]
        4. 将 图片验证码的内容[4个字符] 保存到redis中. key:value
            key --> uuid
            value --> [4个字符]
        5. 返回响应
            返回图片二进制数据
            
'''

from django.views import View
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from django.http import HttpResponse


class ImageCodeView(View):
    def get(self,request,uuid):
        # 1. 接受请求参数
        # 2. 验证请求参数[作业]
        # 3. 生成图片验证码, 获取图片验证码的内容[4个字符]
        #    captcha.generate_captcha() 返回一个元祖
        #    元祖的第一个参数 就是图片验证码的内容[4个字符]
        #    元祖的第二个参数 是图片二进制内容
        text,image = captcha.generate_captcha()
        # 4. 将 图片验证码的内容[4个字符] 保存到redis中. key:value
        #    4.1 连接redis-server 创建redis-cli
        redis_cli = get_redis_connection('code')   # 会加载配置文件的信息 从而操作redis的2号库
        #    4.2 操作string
        #        setex(name, time, vlaue)
        #        同redis中setex指令
        #        120秒
        redis_cli.setex(uuid,120,text)
        # 5. 返回响应
        # content_type = 'image/jpeg'  告诉浏览器 使用图片的方式打开
        return HttpResponse(image,content_type='image/jpeg')
        # 返回图片二进制数据

import re
from django.http import JsonResponse
class SMSCodeView(View):
    def get(self,request,mobile):
        # 1. 接收参数
        query_params = request.GET
        # 2. 提取参数
        image_code = query_params.get('image_code')
        image_code_id = query_params.get('image_code_id')
        # 3. 验证参数[作业]
        # 3.1 验证 image_code的长度
        # if not re.match('\w{4}',image_code):
        #     return JsonResponse({'code':400,'errmsg':'验证码不符合规则'})


        # 3.2 验证 image_code_id的 正则形式

        # 4. 比对用户输入的图片验证码和服务器的图片验证码是否一致
        # 4.1 用户输入的图片验证码
        redis_cli = get_redis_connection('code')
        redis_text = redis_cli.get(image_code_id)
        # 我们的图片验证码有一定的时效 获取的也可能是None
        if redis_text is None:
            return JsonResponse({'code':400, 'errmsg':'图片验证码过期'})
        # 4.2 服务器的图片验证码 获取之后删除
        redis_cli.delete(image_code_id)
        # 4.3 比对
        if redis_text.decode().lower() != image_code.lower():
            return JsonResponse({'code':400,'errmsg':'图片验证码错误'})

        # 在生成短信验证码之前 判断标记
        send_flag = redis_cli.get('send_flag_%s'%mobile)
        #send_flag 只要有值 就说明在频繁操作
        if send_flag is not None:
            return JsonResponse({'code':400,'errmsg':'不要频繁操作'})

        # 5. 生成短信验证码
        from random import randint
        # 不满足 6为 补0
        sms_code = '%06d'%randint(0,999999)

        # ① 创建一个管道
        pipeline = redis_cli.pipeline()
        # ② 让管道收集指令
        # 6. 保存短信验证码
        pipeline.setex(mobile,300,sms_code)
        # redis_cli.setex(mobile,300,sms_code)
        # 设置一个标记位,这个标记位的有限其实60秒
        pipeline.setex('send_flag_%s'%mobile,300,1)
        # ③ 执行管道
        pipeline.execute()
        # 7. 发送短信验证码
        # from utils.sms import send_sms_code
        # send_sms_code(mobile, sms_code, 5)

        from celery_meiduo.sms.tasks import celery_send_sms_code
        celery_send_sms_code.delay(mobile,sms_code,5)

        # 8. 返回响应
        return JsonResponse({'code':0})


























